package com.gm.baseplatform.core.utils;

import java.net.InetAddress;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 生成32unid
 *
 * <pre>
 * public static void main(String[] args)
 * {
 * 	UNIDGenerate unid = new UNIDGenerate();
 * 	System.out.println(&quot;unid=&quot; + unid);
 * }
 * </pre>
 *
 * @author wangguomei
 * @mail e.wanggm@gmail.com
 */
public class UnidGenerate
{

	private static final int IP;
	static
	{
		int ipadd;
		try
		{
			ipadd = toInt(InetAddress.getLocalHost().getAddress());
		}
		catch (Exception e)
		{
			ipadd = 0;
		}
		IP = ipadd;
	}

	private static short counter = (short) 0;

	private static final int JVM = (int) (System.currentTimeMillis() >>> 8);

	private String sep = "";

	
	protected int getJVM()
	{
		return JVM;
	}

	
	protected short getCount()
	{
		synchronized (UnidGenerate.class)
		{
			if (counter < 0)
				counter = 0;
			return counter++;
		}
	}

	
	protected int getIP()
	{
		return IP;
	}

	
	protected short getHiTime()
	{
		return (short) (System.currentTimeMillis() >>> 32);
	}

	
	protected int getLoTime()
	{
		return (int) System.currentTimeMillis();
	}

	
	protected String format(int intval)
	{
		String formatted = Integer.toHexString(intval);
		StringBuffer buf = new StringBuffer("00000000");
		buf.replace(8 - formatted.length(), 8, formatted);
		return buf.toString();
	}

	
	protected String format(short shortval)
	{
		String formatted = Integer.toHexString(shortval);
		StringBuffer buf = new StringBuffer("0000");
		buf.replace(4 - formatted.length(), 4, formatted);
		return buf.toString();
	}

	
	public String toString()
	{
		StringBuffer sb = new StringBuffer(36).append(format(getIP())).append(
				sep).append(format(getJVM())).append(sep).append(
				format(getHiTime())).append(sep).append(format(getLoTime()))
				.append(sep).append(format(getCount()));
		MessageDigest md5 = null;
		try
		{
			md5 = MessageDigest.getInstance("MD5");
		}
		catch (NoSuchAlgorithmException e)
		{
			return sb.toString().toUpperCase();
		}
		md5.update(sb.toString().getBytes());
		byte[] array = md5.digest();
		StringBuffer ret = new StringBuffer();
		for (int j = 0; j < array.length; ++j)
		{
			int b = array[j] & 0xFF;
			if (b < 0x10)
				ret.append('0');
			ret.append(Integer.toHexString(b));
		}
		return ret.toString().toUpperCase();
	}

	
	public String getUnid()
	{
		return toString();
	}

	
	public static boolean isUnid(String str)
	{
		if (str.length() == 32
				&& str
						.matches("[A-Z0-9]{32}"))
		{
			return true;
		}
		return false;
	}
	
	
	public static int toInt( byte[] bytes ) {
		int result = 0;
		for (int i=0; i<4; i++) {
			result = ( result << 8 ) - Byte.MIN_VALUE + (int) bytes[i];
		}
		return result;
	}
	
	
	public static void main(String[] args) {
		for (int i = 0; i < 4; i++) {
			UnidGenerate u= new UnidGenerate();
		    System.out.println(u);
		}
	}

}
